<?php 
interface Adapter
{   
    /**
     * 设置 DISTINCT 值
     * 
     * @param boolean $bool
     * 
     * @return $this
     */
    public function distinct($bool = true);
    
    /**
     * 设置字段和字段值
     * 
     * @param array $fields
     * INSERT UPDATE 用Fields
     * array ('column1' => 'value1', 'column2' => 'value2', 
     *  	  'column3' => 'value3', ......)
     * SELECT 用Fields
     * array ('column1', 'column2', 'column3', ......)
     * 仅有一个字段 string
     * @param string $prefix
     * 
     * @return $this
     */
    public function fields($fields, $prefix = '');
    
    /**
     * 设置表
     * 
     * @param array|string $tables
     * 有别名的  array ('alias1' => 'table1', 'alias2' => 'table2', ...)
     * 无别名的  array ('table1', 'table2', 'table3', ...)
     * 仅有一个表 string
     * 
     * @return $this
     */
	public function table($tables, $prefix = null);
    
    /**
     * 设置左连接
     * 
     * @param array|string $tables
     * 有别名的  array ('alias1' => 'table1', 'alias2' => 'table2', ...)
     * 无别名的  array ('table1', 'table2', 'table3', ...)
     * 仅有一个表 string
     * @param string $on
     * 
     * @return $this
     */
    public function join($tables, $on = '', $prefix = null);
    
    /**
     * 设置 WHERE 条件
     * 
     * @param array $where
     * array ('username = ? AND password = ?', 'iphper', '123456')
     * 
     * @return $this
     */
    public function where(array $where);
    
    /**
     * 设置 GROUP_BY
     * 
     * @param array|string $groups
     * 无别名的  array ('group1', 'group2', 'group3', ...)
     * 仅一个字段 string
     * @param string $prefix
     * 
     * @return $this
     */
    public function group($groups, $prefix = '');
    
    /**
     * 设置 HAVING
     * 
     * @param array $having
     * array ('COUNT(*) > ? AND AVG(SALARY) < ?', '100', '10000')
     * 
     * @return $this
     */
    public function having(array $having);
    
    /**
     * 设置 ORDER_BY
     * 
     * @param array $orders
     * array ('order1' => 'ASC', 'order2' => 'DESC', 'order3', ...)
     * 仅一个字段 string 
     * @param string $prefix
     * 
     * @return $this
     */
    public function order($orders, $prefix = '');
    
    /**
     * 设置 LIMIT 值
     * 
     * @param int $offset
     * @param int $count
     * 
     * @return $this
     */
    public function limit($offset, $count = null);
    
   	/**
	 * 向表里插入一条记录，返回最后一次插入的ID
	 *
	 * @return int
	 */
    public function insert();
    
    /**
	 * 更新表里的一条记录，返回受影响的行数
	 *
	 * @return int
	 */
    public function update();
    
    /**
	 * 删除表里的一条记录，返回受影响的行数
	 *
	 * @return int
	 */
    public function delete();
    
   	/**
	 * 查询表里的所有记录
	 *
	 * @param string $fetchMode
	 * @return array
	 */
    public function select($fetchMode = null);
    
	/**
	 * 查询表里的一条记录
	 * 
	 * @param string $fetchMode
	 * @return array
	 */
	public function find($fetchMode = null);
    /**
     * 返回全部结果集中指定列的结果
     *
     * @param int $columnNumber 列号
     * @return array.
     */
    public function getColumn($columnNumber = 0);
    
    /**
     * 返回一个结果集中指定列的结果
     *
     * @param int $columnNumber 列号
     * @return string|int.
     */
    public function getColumnOne($columnNumber = 0);
    
	/**
	 * 查询表里的所有记录
	 * 
	 * @return array
	 */
	public function getAssoc();
}